/**
 * PDF 文件处理工具
 */

import type { PageRange } from '@/types/ProofMapper';
import type { PDFPage } from 'pdf-lib';

// 动态导入 PDF.js
const loadPdfLib = async () => {
  const pdfjsLib = await import('pdfjs-dist');
  // 从本地加载 worker 文件
pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdf-worker/pdf.worker.min.mjs';
  return pdfjsLib;
};

/**
 * 获取 PDF 文件的总页数
 */
export const getPdfPageCount = async (file: File): Promise<number> => {
  try {
    const pdfjsLib = await loadPdfLib();
    const arrayBuffer = await file.arrayBuffer();
    const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;
    return pdf.numPages;
  } catch (error) {
    console.error('获取PDF页数失败:', error);
    throw new Error('获取PDF页数失败');
  }
};

/**
 * 根据页面范围拆分 PDF 文件
 */
export const splitPdfByRange = async (
  file: File,
  pageRange: PageRange,
  onProgress?: (progress: number) => void
): Promise<File> => {
  try {
    // 如果是全部页面，直接返回原文件
    if (pageRange.mode === 'all') {
      return file;
    }

    // 读取原始 PDF 文件
    const pdfjsLib = await loadPdfLib();
    const fileData = await file.arrayBuffer();
    
    // 为 PDF.js 创建一个新的 ArrayBuffer 副本
    const pdfJsBuffer = fileData.slice(0);
    const pdf = await pdfjsLib.getDocument({ data: pdfJsBuffer }).promise;
    
    // 验证页面范围
    const totalPages = pdf.numPages;
    const startPage = Math.max(1, pageRange.startPage);
    const endPage = Math.min(totalPages, pageRange.endPage);

    if (startPage > endPage) {
      throw new Error('无效的页面范围');
    }

    // 动态导入 pdf-lib
    const { PDFDocument } = await import('pdf-lib');
    
    // 为 pdf-lib 创建一个新的 ArrayBuffer 副本
    const pdfLibBuffer = fileData.slice(0);
    
    // 创建新的 PDF 文档
    const [newPdf, sourcePdf] = await Promise.all([
      PDFDocument.create(),
      PDFDocument.load(pdfLibBuffer)
    ]);

    // 复制选定的页面
    const pages = await newPdf.copyPages(sourcePdf, Array.from(
      { length: endPage - startPage + 1 },
      (_, i) => startPage - 1 + i
    ));

    // 添加页面到新文档
    pages.forEach((page: PDFPage) => {
      newPdf.addPage(page);
      if (onProgress) {
        const progress = (pages.indexOf(page) + 1) / pages.length * 100;
        onProgress(Math.round(progress));
      }
    });

    // 保存新的 PDF 文件
    const newPdfBytes = await newPdf.save();
    // 创建 Blob 对象
    const blob = new Blob([new Uint8Array(newPdfBytes)], { type: 'application/pdf' });
    const newFile = new File([blob], file.name, {
      type: 'application/pdf',
      lastModified: Date.now()
    });

    return newFile;
  } catch (error) {
    console.error('PDF拆分失败:', error);
    throw new Error('PDF拆分失败');
  }
};

/**
 * 验证 PDF 文件的页面范围
 */
export const validatePageRange = async (
  file: File,
  pageRange: PageRange
): Promise<{ isValid: boolean; totalPages: number; error?: string }> => {
  try {
    const totalPages = await getPdfPageCount(file);

    // 如果是全部页面模式，直接返回有效
    if (pageRange.mode === 'all') {
      return { isValid: true, totalPages };
    }

    // 验证页面范围
    if (pageRange.startPage < 1 || pageRange.startPage > totalPages) {
      return {
        isValid: false,
        totalPages,
        error: `起始页必须在 1 到 ${totalPages} 之间`
      };
    }

    if (pageRange.endPage < pageRange.startPage || pageRange.endPage > totalPages) {
      return {
        isValid: false,
        totalPages,
        error: `结束页必须在 ${pageRange.startPage} 到 ${totalPages} 之间`
      };
    }

    return { isValid: true, totalPages };
  } catch (error) {
    console.error('验证页面范围失败:', error);
    return {
      isValid: false,
      totalPages: 0,
      error: '验证页面范围失败'
    };
  }
};
